package bancosys.tec.persist.persister.listener;

import bancosys.tec.persist.Persistable;

/**
 * @author RodrigoK
 * @created: Apr 18, 2008
 * @param <T> A entidade que ao ser persistida, irá executar métodos abaixo de acordo com os listeners configurados.
 */
public interface PersisterListener<T extends Persistable> {

    /**
     * Executado após o insert na base quente.
     * 
     * @param bean bean.
     * @param action action
     */
    void afterInsert(T bean, Object action);

    /**
     * Executado antes do insert na base quente.
     * 
     * @param bean bean.
     * @param action action
     */
    void beforeInsert(T bean, Object action);

    /**
     * Executado após o update na base quente.
     * 
     * @param bean bean.
     * @param action action
     */
    void afterUpdate(T bean, Object action);

    /**
     * Executado antes do update na base quente.
     * 
     * @param bean bean.
     * @param action action
     */
    void beforeUpdate(T bean, Object action);

    /**
     * Executado após o remove na base quente.
     * 
     * @param bean bean.
     */
    void afterRemove(T bean);

    /**
     * Executado antes do remove na base quente.
     * 
     * @param bean bean.
     */
    void beforeRemove(T bean);

    /**
     * Executa qualquer processo que precise ser executado durante a exclusão mas antes da validação.
     * 
     * @param bean bean.
     */
    void doRemoveDependencies(T bean);

    /**
     * @return Classe configurada como target para este listener através de generics.
     */
    Class<? extends T> getTargetClass();
}
